/* * SK's Minecraft Launcher * Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors * Please see LICENSE.txt for license information. */ package com.skcraft.launcher.persistence; import com.google.common.io.ByteSink; import javax.crypto.*; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import java.io.IOException; import java.io.OutputStream; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.util.Random; class ScramblingSinkFilter extends ByteSink { private final ByteSink delegate; private final String key; public ScramblingSinkFilter(ByteSink delegate, String key) { this.delegate = delegate; this.key = key; } @Override public OutputStream openStream() throws IOException { Cipher cipher = null; try { cipher = getCipher(Cipher.ENCRYPT_MODE, key); } catch (Throwable e) { throw new IOException("Failed to create cipher", e); } return new CipherOutputStream(delegate.openStream(), cipher); } public static Cipher getCipher(int mode, String password) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException { // These parameters were used for encrypting lastlogin on old official Minecraft launchers Random random = new Random(0x29482c2L); byte salt[] = new byte[8]; random.nextBytes(salt); PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 5); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = factory.generateSecret(new PBEKeySpec(password.toCharArray())); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(mode, key, paramSpec); return cipher; } }